`timescale 1ns/1ps
`default_nettype none

/* NOTE:
* - 本模负责进行亮度调整
* - 每个周期完成一次计算
* - 输入/输出RGB为16bit无符号数
* - 系数为16bit无符号数，15bit小数位
* - 不考虑溢出情况
*/

module light_adjust (
    // system signal
    input  wire         I_sclk,
    input  wire         I_rst_n,
    // adjust enable
    input  wire         I_adjust_en,
    // input pixel
    input  wire         I_data_en,
    input  wire [15:0]  I_data_in,
    input  wire [2:0]   I_data_color,
    // coefficient
    input  wire [15:0]  I_coe_r,
    input  wire [15:0]  I_coe_g,
    input  wire [15:0]  I_coe_b,
    // result
    output wire         O_valid,
    output wire [15:0]  O_data_out
);
//------------------------Parameter----------------------

//------------------------Local signal-------------------
wire [15:0] coe;
reg         valid_sr;
reg  [31:0] result;

//------------------------Instantiation------------------

//------------------------Body---------------------------
assign O_valid    = valid_sr;
assign O_data_out = result[30:15];

assign coe = ~I_adjust_en? 16'h8000
           : I_data_color[0]? I_coe_r
           : I_data_color[1]? I_coe_g
           : I_coe_b;

// valid_sr
always @(posedge I_sclk or negedge I_rst_n) begin
    if (~I_rst_n)
        valid_sr <= 1'b0;
    else
        valid_sr <= I_data_en;
end

// result
always @(posedge I_sclk) begin
    result <= coe * I_data_in;
end

endmodule

`default_nettype wire

// vim:set ts=4 sw=4 et fenc=utf-8 fdm=marker:
